package cn.like.redis;

import java.text.MessageFormat;

/**
 * redis key 生成工具类
 * <pre>
 *     不带参数
 *     TEST_STRING = "test:string";
 *     带一个参数
 *     HELLO_WORLD = "hello:world:{0}";
 *     多个参数的key拼接
 *     TEST_STRING_ID_NAME="test:string:id:{0}:{1}",
 * </pre>
 * String key =  RedisKey.of("hello:world:{0}",params);
 * desc: 推荐使用方法
 * <pre>
 *     使用枚举类 实现该类，然后以各种需求为命名+RedisKey,比如缓存类的需求: CacheKey
 * </pre>
 *
 * @author like
 * @date 2021/06/04
 */
public interface RedisKey {

    /**
     * key style like :
     * <pre>
     *     1."test:string"
     *     2."hello:world:{0}"
     * </pre>
     *
     * @param keyStyle redis key style
     * @param params   参数
     * @return {@link String} 格式化好的key
     */
    static String of(String keyStyle, Object... params) {
        return MessageFormat.format(keyStyle, params);
    }

    /**
     * @see RedisKey#of(String, Object...)
     */
    static String of(RedisKey redisKey, Object... params) {
        return of(redisKey.keyStyle(), params);
    }

    /**
     * 构建Key
     *
     * @param params 参数
     * @return {@link String} 格式好的key
     */
    default String of(Object... params) {
        return of(keyStyle(), params);
    }

    String keyStyle();
}
